package com.class06.ioc_03;


import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
//    一、属性注入

    @Autowired(required = false)
    //相当于：之前所学的xml配置文件中的setter注入<property name="userService" 
    // ref="userService"/>
//    或者：基于构造函数注入<constructor-arg name="userService" ref="userService"/>
    // 自动装配注解（DI）：1.在ioc容器中查找符合类型的组件对象 
    // 2.将查找到的组件对象注入到当前属性中
//    private UserService userService = new UserService();
//    3、boolean required() default true; // 是否必须注入，默认是必须注入，
//    如果配置为false，则表示非必须注入，此时如果ioc容器中没有找到符合类型的组件对象，
//    则不注入，不报错 ，也叫佛系装配  可以没有  值 = null 
//    不推荐required = false，因为装配的数据后期都会用到，如果没有，会报空指针异常
    @Qualifier("newUserService")

    // @Autowired + @Qualifier("newUserService") = @Resource(name="newUserService")

//    @Resource(name = "userService")
//    此时这name不能省略，因为@Resource默认是按照类型来装配的，
//    如果类型相同，则按照name来装配
//    @Resource(name = "newUserService")
//    4、@Resource 遵行JSR250 规范 也是用于自动装配的注解，可以替代@Autowired
    private UserService userService;


//    二、构造函数注入
    private UserService userService2;


    @Autowired
    public UserController(UserService userService){
        this.userService2 = userService;
    }
    public void show() {
        String show = userService3.show();
        System.out.println("show = " + show);
        
    }



//    三、setter注入
    private UserService userService3;

    @Autowired
    public void setSoldierService(UserService userService) {
        this.userService3 = userService;
    }
}
